//Iterator
// 是一种接口机制，为各种不同的数据结构提供统一访问的机制

// 主要供for  of 消费
// 一句话 不支持遍历的数据结构“可遍历”

// function makeIterator(arr) {
//     let nextIndex = 0;
//     return {
//         next() {
//             return nextIndex < arr.length ? {
//                 value: arr[nextIndex++],
//                 done: false
//             } : {
//                 value: undefined,
//                 done: true
//             }
//         }
//     }
// }
// let it = makeIterator(['1', '2', '3'])
// console.log(it.next());
// console.log(it.next());
// console.log(it.next());
// console.log(it.next());

// let courses={
//     allCourse:{
//         frontend:['es','vue'],
//         backend:['java','python'],
//         webapp:['android','ios']
//     }
// }

// let arr=['a','b','c']
// let it =arr[Symbol.iterator]()
// console.log(it.next());//{value: 'a', done: false}
// console.log(it.next());
// console.log(it.next());


// let map=new Map()
// map.set('name','es')
// map.set('age',15)
// console.log(map);
// let it = map[Symbol.iterator]()
// console.log(it.next());
// console.log(it.next());


// 原生具备Iterator接口的数据结构
/**
 * Array
 * Map
 * Set
 * String
 * TypedArray
 * 函数的arguments对象
 * NodeList对象
 */

// 可迭代协议 拥有Symbol.iterator
// 迭代器协议 return{ next(){return{value,done}}}
// let courses={
//     allCourse:{
//         frontend:['es','vue'],
//         backend:['java','python'],
//         webapp:['android','ios']
//     }
// }

// courses[Symbol.iterator]=function(){
//     let allCourse =this.allCourse
//     let keys=Reflect.ownKeys(allCourse)
//     let values=[]
//     return{
//         next(){
//             if(!values.length){
//                 if(keys.length){
//                     values=allCourse[keys[0]]
//                     keys.shift()
//                 }
//             }
//             console.log(values);
//             return{
                
//                 done:!values.length,
//                 value:values.shift()
//             }
//         }
//     }
   
// }

// for (const c of courses) {
//     console.log(c);
// }